﻿

#include "contact.h"

//输入需要保存的联系人的信息
void serve(SHListNode* phead)
{
	printf("请输入需要存录联系人的姓名：\n");
	scanf("%s", phead->data.name);
	printf("请输入需要存录联系人的性别：\n");
	scanf("%s", phead->data.sex);
	printf("请输入需要存录联系人的年龄：\n");
	scanf("%d", &phead->data.age);
	printf("请输入需要存录联系人的电话号码：\n");
	scanf("%s", phead->data.phone);
	printf("请输入需要存录联系人的住址：\n");
	scanf("%s", phead->data.address);
}

//生成一个新的结点
SHListNode* getbuynode()
{
	SHListNode* newnode = (SHListNode*)malloc(sizeof(SHListNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(1);
	}

	serve(newnode);
	newnode->next = NULL;

	return newnode;
}

//初始化,生成哨兵位
SHListNode* SHLINIT()
{
	SHListNode* newnode = (SHListNode*)malloc(sizeof(SHListNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(1);
	}

	newnode->next = NULL;
	return newnode;
}

//打印出链表
void SHLprintf(SHListNode* phead)
{
	printf("姓名\t性别\t年龄\t电话\t\t住址\n");

	SHListNode* pcur = phead->next;

	while (pcur)
	{
		printf("%s\t", pcur->data.name);
		printf("%s\t", pcur->data.sex);
		printf("%d\t", pcur->data.age);
		printf("%s\t\t", pcur->data.phone);
		printf("%s\n", pcur->data.address);

		pcur = pcur->next;
	}
}

//尾插
void SHLPushback(SHListNode* phead)
{
	assert(phead);

	SHListNode* newnode = getbuynode();
	SHListNode* pcur = phead;

	while (pcur->next !=NULL)
	{
		pcur = pcur->next;
	}

	pcur->next = newnode;
}

//头插
void SHLPushfront(SHListNode* phead)
{
	assert(phead);

	SHListNode* newnode = getbuynode();
	
	newnode->next = phead->next;
	phead->next = newnode;
}


//尾删
void SHLDelback(SHListNode* phead)
{
	assert(phead && phead->next);
	SHListNode* pcur = phead;
	SHListNode* del = pcur;

	while (del->next != NULL)
	{
		pcur = del;
		del = del->next;
	}
	pcur->next = NULL;
	free(del);
	del = NULL;
}

//头删
void SHLDelfront(SHListNode* phead)
{
	assert(phead && phead->next);
	SHListNode* del = phead->next;

	phead->next = phead->next->next;
	free(del);
	del = NULL;
}




//查找  找到返回该节点，否则返回NULL
SHListNode* SHLFind(SHListNode* phead,char name[])
{
	assert(phead);
	SHListNode* pcur = phead;

	while (pcur)
	{
		if (strcmp(pcur->data.name,name) == 0)
			return pcur;

		pcur = pcur->next;
	}

	return NULL;
}

void mune()
{
	printf("******************************************\n");
	printf("------------------------------------------\n");
	printf("     1.姓名                     2.性别    \n");
	printf("     3.年龄                     4.电话    \n");
	printf("     4.住址                     0.退出修改\n");
	printf("------------------------------------------\n");
	printf("******************************************\n");


}


void modify(SHListNode* pcur)
{
	int n = 0;
	do
	{
		mune();
		printf("请问你要修改什么数据，请选择：");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			printf("请输入修改的姓名：");
			scanf("%s", pcur->data.name);
			break;
		case 2:
			printf("请输入修改的性别：");
			scanf("%s", pcur->data.sex);
			break;
		case 3:
			printf("请输入修改的年龄：");
			scanf("%d", &pcur->data.age);
			break;
		case 4:
			printf("请输入修改的电话：");
			scanf("%s", pcur->data.phone);
			break;
		case 5:
			printf("请输入修改的住址：");
			scanf("%s", pcur->data.address);
			break;
		case 0:
			printf("退出修改..\n");
			break;
		default:
			printf("输入错误，请重新输入\n");
			break;
		}
	} while (n);
	printf("修改成功!!!\n");
}

//修改通讯录数据
void SHLModify(SHListNode* phead)
{
	printf("请输入要修改的联系人的姓名:");
	char name[NAME];
	scanf("%s", name);

	SHListNode* pos = SHLFind(phead,name);
	if (pos == NULL)
	{
		printf("修改失败，没有找到该联系人\n");
		return;
	}

	//可以进行修改
	modify(pos);
}

//生成一个新的结点
SHListNode* getbuynode1(SHLType x)
{
	SHListNode* newnode = (SHListNode*)malloc(sizeof(SHListNode));
	if (newnode == NULL)
	{
		perror("malloc");
		exit(1);
	}

	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

//在指定位置的后面插入数据
void SHLPushback(SHListNode* phead, SHLType x)
{
	assert(phead);
	SHListNode* newnode = getbuynode(x);
	SHListNode* pcur = phead;
	//找到最后一个节点
	while (pcur->next != NULL)
	{
		pcur = pcur->next;
	}
	//最后让链表的最后的那个节点和新节点连起来
	pcur->next = newnode;
}

//
void LoadContact(SHListNode** con) {
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL) {
		perror("fopen error!\n");
		return;
	}
	//循环读取⽂件数据
	SHLType info;
	while (fread(&info, sizeof(info), 1, pf))
	{
		SHLPushback(*con, info);
	}
	printf("历史数据导⼊通讯录成功！\n");
}


void SaveContact(SHListNode* con) {
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL) {
		perror("fopen error!\n");
		return;
	}
	//将通讯录数据写⼊⽂件
	SHListNode* cur = con;
	while (cur)
	{
		fwrite(&(cur->data), sizeof(cur->data), 1, pf);
		cur = cur->next;
	}
	printf("通讯录数据保存成功！\n");
}


//void SHLModify1(SHListNode* phead)
//{
//	printf("请输入要修改的联系人的姓名:");
//	SHListNode* ret = phead;
//	SHListNode* pcur = phead;
//
//	scanf("%s", ret->data.name);
//	int flag = 0;
//	while (pcur)
//	{
//		if (strcmp(pcur->data.name, ret->data.name) == 0)
//		{
//			/*modify(&pcur);*/
//			int n = 0;
//			do
//			{
//				mune();
//				printf("请问你要修改什么数据，请选择：");
//				scanf("%d", &n);
//				switch (n)
//				{
//				case 1:
//					printf("请输入修改的姓名：");
//					scanf("%s", pcur->data.name);
//					break;
//				case 2:
//					printf("请输入修改的性别：");
//					scanf("%s", pcur->data.sex);
//					break;
//				case 3:
//					printf("请输入修改的年龄：");
//					scanf("%d", &pcur->data.age);
//					break;
//				case 4:
//					printf("请输入修改的电话：");
//					scanf("%s", pcur->data.phone);
//					break;
//				case 5:
//					printf("请输入修改的住址：");
//					scanf("%s", pcur->data.address);
//					break;
//				case 0:
//					printf("退出修改..\n");
//					break;
//				default:
//					printf("输入错误，请重新输入\n");
//					break;
//				}
//			} while (n);
//
//			flag = 1;
//		}
//
//		pcur = pcur->next;
//	}
//
//	if (flag == 0)
//		printf("修改失败，没有找到该数据\n");
//	if (flag == 1)
//		printf("修改成功\n");
//}